openUBMC pre-commit 代码风格可视化 - 详细设计说明书

所属SIG组:CICD
落入版本:26.09
设计人员:马思雨
日期:2026.7.16

Copyright © 2026 openUBMC Community

您对"本文档"的复制,使用,修改及分发受木兰宽松许可证, 第2版协议(以下简称"MulanPSL2")的约束。 为了方便用户理解,您可以通过访问https://license.coscl.org.cn/MulanPSL2了解MulanPSL2的概要 (但不是替代)。 MulanPSL2的完整协议内容您可以访问如下网址获取:https://license.coscl.org.cn/MulanPSL2

改版记录

日期修订版本修订描述作者审核
2026/07/160.0.1初始版本masiyu

List of abbreviations 缩略语清单

Abbreviations 缩略语Full spelling 英文全名Chinese explanation 中文解释
pre-commitpre-commit frameworkGit钩子管理框架
clang-formatClangFormatC/C++代码格式化工具
ruffRuffPython极速lint+format工具
PrettierPrettier多语言代码格式化工具
StyLuaStyLuaLua代码格式化工具
LuacheckLuacheckLua静态分析(lint)工具
CSRComponent Self-description Record组件自描述记录
PSRProduct Self-description Record产品自描述记录

[TOC]

1.功能分析

1.1 功能背景

原有代码规范性检查依赖流水线codecheck门禁,仅在代码提交到远端后触发,开发者无法在本地及时识别和清理问题,导致反复提交-修复循环;各语言栈(C/C++、Python、JS/Vue、Lua)原本均无pre-commit钩子,既无格式化也无lint;编码规范未以配置文件形式固化到仓库,风格不可见。

引入pre-commit机制后的价值:

  1. 本地识别与清理:问题在git commit阶段即被发现和修复,无需等待远端流水线
  2. 代码一致性与规范性:确保社区所有开发者的代码风格保持一致
  3. 消减codecheck门禁:pre-commit覆盖原有codecheck大部分检查项,前置到本地提交阶段,提升合入效率
  4. 编码风格可视化:风格配置文件固化到各仓库,开发者直观可读

1.2 功能描述

  1. 引入pre-commit机制消减流水线codecheck门禁,判断代码仓是否存在.pre-commit-config.yaml文件来确定是否开启
  2. openUBMC/pre-commit-hooks仓库(https://gitcode.com/openUBMC/pre-commit-hooks.git)提供统一钩子manifest
  3. 按语言栈分类提供钩子:C/C++(clang-format)、Python(ruff)、JS/Vue(prettier)、Lua(stylua-format + luacheck)
  4. 各组件仓库通过.pre-commit-config.yaml按需引用,编码风格通过配置文件可视化(.clang-format/pyproject.toml/.prettierrc.js/.stylua.toml/.luacheckrc)

1.3 功能场景

场景编号场景名称描述使用对象
SC-01C/C++组件提交检查clang-formatC/C++开发者
SC-02Python仓库提交检查ruffPython开发者
SC-03JS/Vue仓库提交检查prettierWebUI开发者
SC-04Lua组件提交检查stylua-format + luacheckLua开发者
SC-05commit-msg校验conventional-commit + add-signoff-and-change-id所有开发者
SC-06pre-commit机制启用判断流水线通过.pre-commit-config.yaml判断是否开启CI/CD系统

开发者操作指导

判断是否开启pre-commit机制:查看代码仓是否存在.pre-commit-config.yaml文件。

操作步骤:

  1. 同步最新代码
  2. 安装pre-commit(参考仓库根目录CONTRIBUTING.md):
    bash
    pip install pre-commit
    pre-commit install --hook-type commit-msg
    pre-commit install
  3. 检查代码质量:
    bash
    pre-commit run --all-files
    pre-commit run --hook-stage commit-msg --commit-msg-filename .git/COMMIT_EDITMSG

1.4 功能列表

功能编号功能标题功能描述
F-01pre-commit机制引入消减codecheck门禁,通过.pre-commit-config.yaml标识启用状态
F-02clang-format钩子C/C++代码格式化(-style=file,读取.clang-format)
F-03ruff钩子Python格式化与lint(读取pyproject.toml)
F-04prettier钩子JS/Vue代码格式化(读取.prettierrc.js)
F-05stylua-format/luacheck钩子Lua格式化(.stylua.toml)与lint(.luacheckrc)
F-06conventional-commit钩子commit-msg格式校验
F-07add-signoff-and-change-id钩子自动追加Signed-off-by和Change-Id
F-08check-sr钩子.sr文件语法校验

2.功能设计

2.1 总体方案分析

2.1.1 方案详细设计

2.1.1.1 方案概述

关键点描述技术实现
pre-commit机制引入替代流水线codecheck门禁.pre-commit-config.yaml标识启用状态
统一钩子manifest单一仓库提供所有语言栈钩子定义.pre-commit-hooks.yaml
按需引用各仓库按语言栈选择性启用.pre-commit-config.yaml
编码风格可视化风格配置文件随仓库分发.clang-format/.prettierrc.js/.stylua.toml/.luacheckrc/pyproject.toml
codecheck门禁消减pre-commit覆盖的检查项消减流水线codecheck流水线判断.pre-commit-config.yaml

2.1.1.2 开发视图

openUBMC/pre-commit-hooks仓库结构

text
openUBMC/pre-commit-hooks/
├── .pre-commit-hooks.yaml              # 钩子manifest
├── .pre-commit-config.yaml             # 推荐配置示例
├── hooks/                              # openUBMC专属钩子(零网络依赖)
│   ├── conventional_commit.py
│   ├── add_signoff_and_change_id.py
│   └── check_sr.py
├── pyproject.toml                      # Python项目元数据
├── package.json                        # Node项目元数据
├── tests/                              # 钩子单元测试
└── README.md

组件仓库配置结构(按语言栈分类)

text
# C/C++ 组件(libmcpp)
├── .pre-commit-config.yaml       # clang-format + 专属钩子
├── .clang-format                 # 格式化规则

# Python 组件(bingo)
├── .pre-commit-config.yaml       # ruff + 专属钩子
├── pyproject.toml                # ruff配置

# JS/Vue 组件(webui)
├── .pre-commit-config.yaml       # prettier + 专属钩子
├── .prettierrc.js                # 格式化规则

# Lua 组件(general_hardware)
├── .pre-commit-config.yaml       # stylua-format + luacheck + 专属钩子
├── .stylua.toml                  # 格式化规则
├── .luacheckrc                   # lint规则

2.1.1.3 运行视图

text
┌────────────┐     ┌──────────────────────┐     ┌─────────────────────────────────┐
│  git commit│────▶│ .pre-commit-         │────▶│ 按语言栈筛选暂存文件              │
│            │     │ config.yaml          │     │ .c/.cpp ──▶ clang-format       │
└────────────┘     │ 声明 repo/rev/       │     │ .py     ──▶ ruff               │
                   │ hook ID              │     │ .js/.vue──▶ prettier            │
                   │ pre-commit 据此从    │     │ .lua    ──▶ stylua/luacheck    │
                   │ 远端仓库拉取钩子定义 │     └─────────────────────────────────┘
                   └──────────────────────┘                      │
                ┌─────────────────────────────────────────┴─────────────────────┐
                │  钩子执行阶段                                                  │
                │                                                                │
                │  commit-msg 阶段:                                              │
                │    conventional-commit ──▶ 校验格式                            │
                │    add-signoff-and-change-id ──▶ 追加 trailer                  │
                │                                                                │
                │  pre-commit 阶段(按文件类型):                                 │
                │                                                                │
                │  语言栈      格式化(auto-fix)      lint(检出阻断)               │
                │  ────────    ──────────────      ──────────────               │
                │  C/C++       clang-format        —                            │
                │  Python      ruff(format)        ruff(check)                  │
                │  JS/Vue      prettier            —                            │
                │  Lua         stylua-format       luacheck                     │
                │                                                                │
                └────────────────────────────────────────────────────────────────┘

                    ┌──────────────────┴──────────────────┐
                    │  结果判定                            │
                    │  auto-fix 钩子 ──▶ 原地修改,重新提交 │
                    │  lint 错误 ──▶ 阻断提交,报错退出│
                    └──────────────────────────────────────┘

2.1.2 依赖分析

外部依赖类型版本要求用途
pre-commitPython工具>= 3.0.0钩子管理框架
clang-formatpip包22.1.5C/C++格式化
ruffpip包待定Python格式化+lint
prettiernpm包3.0.3JS/Vue格式化
stylua系统工具最新Lua格式化(宿主机预装)
luacheck系统工具最新Lua lint(宿主机预装)
Python运行环境>= 3.9专属钩子运行
Node.js运行环境>= 16prettier运行

2.1.3 北向接口分析

本功能为开发工具基础设施,不对外暴露北向接口。流水线通过判断.pre-commit-config.yaml是否存在确定是否开启pre-commit,开启后消减codecheck门禁。

2.1.4 兼容性分析

  • 各钩子通过.pre-commit-config.yaml选择性启用,未引用的仓库不受影响
  • pre-commit前置了codecheck大部分检查项,消减后提升合入效率
  • 判断是否开启:代码仓存在.pre-commit-config.yaml即开启

2.1.5 定制化接口分析

钩子ID默认参数配置文件
clang-format-i -style=file.clang-format
ruffpyproject.toml
prettier--write.prettierrc.js
stylua-format--config-path .stylua.toml --verify.stylua.toml
luacheck--config .luacheckrc --codes --no-color --ranges.luacheckrc

2.1.6 ~ 2.1.9

不涉及配置导入导出、传感器新增、告警事件新增、系统锁定。

2.1.10 用例场景分析

用例编号用例名称前置条件操作步骤预期结果
UC-01C/C++提交检查libmcpp已配置clang-format1. 修改.cpp 2. git commitformat auto-fix通过或阻断
UC-02Python提交检查仓库已配置ruff1. 修改.py 2. git commitruff格式化+lint通过
UC-03JS/Vue提交检查webui已配置prettier1. 修改.vue 2. git commitprettier格式化通过
UC-04Lua提交检查general_hardware已配置stylua/luacheck1. 修改.lua 2. git commitstylua格式化 + luacheck通过
UC-05pre-commit启用代码仓含.pre-commit-config.yaml1. pip install + pre-commit install钩子自动生效
UC-06codecheck门禁消减代码仓已开启pre-commit1. 提交代码 2. 流水线判断配置文件存在消减codecheck,合入效率提升

2.2 非功能质量属性设计

2.2.1 扩展性分析

  1. 各格式化工具通过配置文件定制,仓库可差异化
  2. manifest可新增更多语言栈钩子(如Go/Rust)
  3. hooks/目录可新增openUBMC专属脚本

2.2.2 重用性分析

manifest和专属钩子被所有社区仓库复用,风格配置文件模式可被新仓库直接拷贝复用。

2.2.3 可测试性分析

  1. 社区流水线配置pre-commit门禁扫描修改内容
  2. pre-commit run --all-files全量扫描

2.2.4 资料分析

README.md提供快速开始、钩子详解、配置定制和团队协作指南。组件仓库的CONTRIBUTING.md提供安装步骤。无对外API。

2.2.5 可靠性分析

  1. add-signoff-and-change-id和clang-format幂等
  2. lint错误阻断提交但不修改文件;auto-fix原地修改但git可回退
  3. clang-format缺失.clang-format时按LLVM默认风格(不报错)
  4. pre-commit覆盖的检查项可安全消减codecheck,未覆盖的仍保留在流水线

3.功能实现

3.1 功能实现设计

钩子定义示例

以已合入的clang-format为例,说明manifest中钩子的定义方式:

yaml
- id: clang-format
  name: clang-format
  description: C/C++ 代码格式化 (原地修改,使用项目 .clang-format)
  entry: clang-format
  language: python
  types_or: [c++, c, c#, cuda, java, javascript, json, objective-c, proto, textproto]
  args:
    - -i
    - -style=file
  additional_dependencies: ['clang-format==22.1.5']
  minimum_pre_commit_version: '2.9.2'

各组件仓库.pre-commit-config.yaml示例

libmcpp(C/C++):

yaml
repos:
  - repo: https://gitcode.com/openUBMC/pre-commit-hooks
    rev: 0.1.2
    hooks:
      - id: conventional-commit
      - id: add-signoff-and-change-id
      - id: check-sr
      - id: check-json
        exclude: '\.vscode/'
      - id: check-yaml
      - id: clang-format
        types_or: [c++, c]

开发者测试

单元测试

bash
pre-commit run clang-format --files src/foo.cpp
pre-commit run prettier --files src/bar.vue
pre-commit run stylua-format --files src/hardware.lua
pre-commit run luacheck --files src/hardware.lua

集成测试

bash
pre-commit run --all-files